/**
 *                            License
 * THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS  
 * CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). 
 * THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW.  
 * ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR  
 * COPYRIGHT LAW IS PROHIBITED.
 * 
 * BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND  
 * AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE  
 * MAY BE CONSIDERED TO BE A CONTRACT,
 * THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED 
 * HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
 * 
 */
package lineage.model;

import java.io.Serializable;

import lineage.model.map.L1Map;
import lineage.model.map.L1WorldMap;

/**
 * 游戏内所有可控对象的共同父类.
 * 
 * @version 2014年3月17日下午10:06:00
 * @author jrwz
 */
public abstract class L1Object implements Serializable {
    private static final long serialVersionUID = 7107113667742736281L;
    /** 对象所在的位置. */
    private final L1Location location = new L1Location();
    /** 对象的唯一编号(objId). */
    private int id;
    /** 对象目前所在的地图编号(临时). */
    private int tempMapId;
    /** 对象目前所在的X坐标(临时). */
    private int tempX;
    /** 对象目前所在的Y坐标(临时). */
    private int tempY;
    /** 对象的名称. */
    private String name;
    /** 对象目前的面向. */
    private int heading;
    /** 对象目前的面向(临时). */
    private int tempHeading;

    /**
     * 取得对象的唯一编号(objId).
     * 
     * @return 该编号
     */
    public int getId() {
        return id;
    }

    /**
     * 设置对象的唯一编号(objId).
     * 
     * @param id
     *            - 要设置的编号
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * 取得对象目前所在的地图编号.
     * 
     * @return 该地图编号
     */
    public int getMapId() {
        return location.getMap().getMapId();
    }

    /**
     * 设置对象目前所在的地图编号.
     * 
     * @param mapId
     *            - 要设置的地图编号
     */
    public void setMapId(int mapId) {
        location.setMap(L1WorldMap.getInstance().getMap(mapId));
    }

    /**
     * 取得对象目前所在的地图.
     * 
     * @return 该地图
     */
    public L1Map getMap() {
        return location.getMap();
    }

    /**
     * 设置对象目前所在的地图.
     * 
     * @param map
     *            - 要设置的地图
     */
    public void setMap(final L1Map map) {
        if (map == null) {
            throw new NullPointerException();
        }
        location.setMap(map);
    }

    /**
     * 取得对象目前所在的X坐标.
     * 
     * @return 该坐标值
     */
    public int getX() {
        return location.getX();
    }

    /**
     * 设置对象目前所在的X坐标.
     * 
     * @param x
     *            - 要设置的坐标值
     */
    public void setX(int x) {
        location.setX(x);
    }

    /**
     * 取得对象目前所在的Y坐标.
     * 
     * @return 该坐标值
     */
    public int getY() {
        return location.getY();
    }

    /**
     * 设置对象目前所在的Y坐标.
     * 
     * @param y
     *            - 要设置的坐标值
     */
    public void setY(int y) {
        location.setY(y);
    }

    /**
     * 取得对象所在的位置.
     * 
     * @return 当前位置
     */
    public L1Location getLocation() {
        return location;
    }

    /**
     * 设置对象的位置.
     * 
     * @param loc
     *            - 位置
     */
    public void setLocation(final L1Location loc) {
        setLocation(loc.getX(), loc.getY(), loc.getMapId());
    }

    /**
     * 设置对象的位置.
     * 
     * @param x
     *            - 要设置的x坐标
     * @param y
     *            - 要设置的y坐标
     * @param mapId
     *            - 要设置的地图编号
     */
    public void setLocation(final int x, final int y, final int mapId) {
        location.setX(x);
        location.setY(y);
        location.setMap(mapId);
    }

    /**
     * 取得对象的名称.
     * 
     * @return 对象的名称
     */
    public String getName() {
        return name;
    }

    /**
     * 设置对象的名称.
     * 
     * @param name
     *            - 要设置的名称
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 取得对象目前的面向.
     * 
     * @return 对象目前的面向
     */
    public int getHeading() {
        return heading;
    }

    /**
     * 设置对象目前的面向.
     * 
     * @param heading
     *            - 要设置的面向
     */
    public void setHeading(int heading) {
        this.heading = heading;
    }

    /**
     * 取得对象目前所在的地图编号(临时).
     * 
     * @return 地图编号
     */
    public int getTempMapId() {
        return tempMapId;
    }

    /**
     * 设置对象目前所在的地图编号(临时).
     * 
     * @param tempMapId
     *            - 要设置的地图编号
     */
    public void setTempMapId(int tempMapId) {
        this.tempMapId = tempMapId;
    }

    /**
     * 取得对象目前所在的X坐标(临时).
     * 
     * @return x坐标
     */
    public int getTempX() {
        return tempX;
    }

    /**
     * 设置对象目前所在的X坐标(临时).
     * 
     * @param tempX
     *            - 要设置的y坐标
     */
    public void setTempX(int tempX) {
        this.tempX = tempX;
    }

    /**
     * 取得对象目前所在的Y坐标(临时).
     * 
     * @return y坐标
     */
    public int getTempY() {
        return tempY;
    }

    /**
     * 设置对象目前所在的Y坐标(临时).
     * 
     * @param tempY
     *            - 要设置的y坐标
     */
    public void setTempY(int tempY) {
        this.tempY = tempY;
    }

    /**
     * 取得对象目前的面向(临时).
     * 
     * @return 面向
     */
    public int getTempHeading() {
        return tempHeading;
    }

    /**
     * 设置对象目前的面向(临时).
     * 
     * @param tempHeading
     *            - 要设置的面向
     */
    public void setTempHeading(int tempHeading) {
        this.tempHeading = tempHeading;
    }
}
